#include "VideoLogger.h"
#include "Logger.hh"
#include "LogConfig.hh"

#include <cstdarg>
#include <cstdio>

namespace {

void video_log_internal(LogLevel level, const char* fmt, va_list args) {
    // 检查日志总开关和模块开关
    LogConfig& config = LogConfig::getInstance();
    if (!config.isLoggingEnabled() || !config.isModuleEnabled(LogModule::VIDEO)) {
        return;
    }
    
    char buffer[1024];
    vsnprintf(buffer, sizeof(buffer), fmt, args);

    switch (level) {
    case LogLevel::DEBUG:
        LOG_DEBUG("%s", buffer);
        break;
    case LogLevel::INFO:
        LOG_INFO("%s", buffer);
        break;
    case LogLevel::WARNING:
        LOG_WARNING("%s", buffer);
        break;
    case LogLevel::ERROR:
    default:
        LOG_ERROR("%s", buffer);
        break;
    }
}

} // namespace

extern "C" void video_log_error(const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    video_log_internal(LogLevel::ERROR, fmt, args);
    va_end(args);
}

extern "C" void video_log_warning(const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    video_log_internal(LogLevel::WARNING, fmt, args);
    va_end(args);
}

extern "C" void video_log_info(const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    video_log_internal(LogLevel::INFO, fmt, args);
    va_end(args);
}

extern "C" void video_log_debug(const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    video_log_internal(LogLevel::DEBUG, fmt, args);
    va_end(args);
}

// 环形缓冲区日志函数（供ringfifo.c使用）
extern "C" void ringfifo_log_error(const char* fmt, ...) {
    // 检查模块开关
    LogConfig& config = LogConfig::getInstance();
    if (!config.isLoggingEnabled() || !config.isModuleEnabled(LogModule::RINGFIFO)) {
        return;
    }
    
    va_list args;
    va_start(args, fmt);
    char buffer[1024];
    vsnprintf(buffer, sizeof(buffer), fmt, args);
    va_end(args);
    LOG_ERROR("[RINGFIFO] %s", buffer);
}

extern "C" void ringfifo_log_warning(const char* fmt, ...) {
    LogConfig& config = LogConfig::getInstance();
    if (!config.isLoggingEnabled() || !config.isModuleEnabled(LogModule::RINGFIFO)) {
        return;
    }
    
    va_list args;
    va_start(args, fmt);
    char buffer[1024];
    vsnprintf(buffer, sizeof(buffer), fmt, args);
    va_end(args);
    LOG_WARNING("[RINGFIFO] %s", buffer);
}

extern "C" void ringfifo_log_info(const char* fmt, ...) {
    LogConfig& config = LogConfig::getInstance();
    if (!config.isLoggingEnabled() || !config.isModuleEnabled(LogModule::RINGFIFO)) {
        return;
    }
    
    va_list args;
    va_start(args, fmt);
    char buffer[1024];
    vsnprintf(buffer, sizeof(buffer), fmt, args);
    va_end(args);
    LOG_INFO("[RINGFIFO] %s", buffer);
}

extern "C" void ringfifo_log_debug(const char* fmt, ...) {
    LogConfig& config = LogConfig::getInstance();
    if (!config.isLoggingEnabled() || !config.isModuleEnabled(LogModule::RINGFIFO)) {
        return;
    }
    
    va_list args;
    va_start(args, fmt);
    char buffer[1024];
    vsnprintf(buffer, sizeof(buffer), fmt, args);
    va_end(args);
    LOG_DEBUG("[RINGFIFO] %s", buffer);
}

